/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.webhomesites.locacao.presenter;

import br.com.webhomesites.locacao.contracts.IDevolucaoTotComPagPresenter;
import br.com.webhomesites.locacao.contracts.IDevolucaoTotComPagView;
import br.com.webhomesites.locacao.model.*;
import br.com.webhomesites.locacao.presenter.DevolucaoTotComPagPresenterActionListeners.CancelarActionListener;
import br.com.webhomesites.locacao.presenter.DevolucaoTotComPagPresenterActionListeners.ConfirmarActionListener;
import br.com.webhomesites.locacao.presenter.DevolucaoTotComPagPresenterActionListeners.ReciboActionListener;
import br.com.webhomesites.locacao.view.DevolucaoTotComPagView;
import br.com.webhomesites.padrao.utils.ManipuladorDatas;
import br.com.webhomesites.padrao.utils.Strategy;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Webhome
 */
public class DevolucaoTotComPagPresenter implements IDevolucaoTotComPagPresenter {

    private DevolucaoTotComPagView view;
    private LocacaoModel locacaoModel;
    private List<ItemLocacaoModel> listaItemLocacaoModel = new ArrayList<>();
    private ItemLocacaoDAO itemLocacaoDAO = new ItemLocacaoDAO();
    private RenovacaoLocacaoModel renovacaoLocacaoModel;
    private RenovacaoLocacaoDAO renovacaoLocacaoDAO;
    private LocacaoDAO locacaoDAO;
    public final Strategy CONFIRMAR_STRATEGY = new ConfirmarStrategy();
    private Strategy operacao = CONFIRMAR_STRATEGY;
    DevolucaoPresenter devolucaoPresenter;
    DecimalFormat df = new DecimalFormat("###,###,##0.00");
    DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
    private boolean mostraView = false;

    public DevolucaoTotComPagPresenter(DevolucaoTotComPagView view, LocacaoModel locacaoModel, LocacaoDAO locacaoDAO) {

        this.view = view;
        this.locacaoModel = locacaoModel;
        this.locacaoDAO = locacaoDAO;
        renovacaoLocacaoDAO = new RenovacaoLocacaoDAO();

    }

    @Override
    public void setUpViewListeners() {
        view.setConfirmarActionListener(new ConfirmarActionListener(this));
        view.setCancelarActionListener(new CancelarActionListener(this));
        view.setReciboActionListener(new ReciboActionListener(this));
        view.setDescontoActionListener(new DevolucaoGenericPresenterActionListener.EnterListener(this, null, null));
        view.setDescontoFocusListener(new DevolucaoGenericPresenterActionListener.LostFocusListener(this, null, null));
        view.setDescontoPorcentoFocusListener(new DevolucaoGenericPresenterActionListener.LostFocusListener(this, null, null));
        
    }   
    
    @Override
    public void updateViewFromAutomatismo() {
        view.setValorDescontoValor("0.00");
        view.setValorDescontoPorcentagem("0.00");
        view.setDataDevolucao(formatter.format(ManipuladorDatas.getDataAtual()));
        view.setDataPagamento(formatter.format(ManipuladorDatas.getDataAtual()));
    }

    @Override
    public void updateViewFromLocacaoModel() {

        mostraView = true;

        listaItemLocacaoModel = itemLocacaoDAO.findByIdLocacao(locacaoModel.getId());
        
        locacaoModel = DevolucaoBO.calcularDevolucaoParcialLocacao(listaItemLocacaoModel, locacaoModel);
        
        view.setDataLocacao(formatter.format(locacaoModel.getDataLocacao()));
        view.setDiasLocacaoAtual(locacaoModel.getDiasLocacao());
        view.setDataPrevDevolucaoAtual(formatter.format(locacaoModel.getDataPrevDevolucao()));
        view.setValorTotalLocacaoPrevisto(df.format(locacaoModel.getValorParcialPrevisto()));
        view.setDiasLocacaoCalculado(ManipuladorDatas.diferencaEntreDatas(locacaoModel.getDataLocacao(), ManipuladorDatas.getDataAtual()));
        view.setValorTotalLocacao(df.format(DevolucaoBO.calcularValorAPagar(locacaoModel.getValorParcialPrevisto(), locacaoModel.getDiasLocacao(), ManipuladorDatas.diferencaEntreDatas(locacaoModel.getDataLocacao(), ManipuladorDatas.getDataAtual()))));
        view.setValorTotalPagar(df.format(DevolucaoBO.calcularValorAPagar(locacaoModel.getValorParcialPrevisto(), locacaoModel.getDiasLocacao(), ManipuladorDatas.diferencaEntreDatas(locacaoModel.getDataLocacao(), ManipuladorDatas.getDataAtual()))));

    }
    
     @Override
    public void updateViewFromRenovavaoLocacaoModel() {

        mostraView = true;
        //*******************Pega a última renovação de uma locação para exibí-la na view
        renovacaoLocacaoModel = renovacaoLocacaoDAO.findLastRenovacaoByIdLocacao(locacaoModel.getId());
        
        listaItemLocacaoModel = itemLocacaoDAO.findByIdLocacao(locacaoModel.getId());
        
        renovacaoLocacaoModel = DevolucaoBO.calcularDevolucaoParcialRenovacao(listaItemLocacaoModel, renovacaoLocacaoModel);

        view.setDataLocacao(formatter.format(renovacaoLocacaoModel.getDataRenovacao()));
        view.setDiasLocacaoAtual(renovacaoLocacaoModel.getDiasLocacao());
        view.setDataPrevDevolucaoAtual(formatter.format(renovacaoLocacaoModel.getDataPrevDevolucao()));
        view.setValorTotalLocacaoPrevisto(df.format(renovacaoLocacaoModel.getValorParcialPrevisto()));
        view.setDiasLocacaoCalculado(ManipuladorDatas.diferencaEntreDatas(renovacaoLocacaoModel.getDataRenovacao(), ManipuladorDatas.getDataAtual()));
        view.setValorTotalLocacao(df.format(DevolucaoBO.calcularValorAPagar(renovacaoLocacaoModel.getValorParcialPrevisto(), renovacaoLocacaoModel.getDiasLocacao(), ManipuladorDatas.diferencaEntreDatas(renovacaoLocacaoModel.getDataRenovacao(), ManipuladorDatas.getDataAtual()))));
        view.setValorTotalPagar(df.format(DevolucaoBO.calcularValorAPagar(renovacaoLocacaoModel.getValorParcialPrevisto(), renovacaoLocacaoModel.getDiasLocacao(), ManipuladorDatas.diferencaEntreDatas(renovacaoLocacaoModel.getDataRenovacao(), ManipuladorDatas.getDataAtual()))));

    }

    @Override
    public void novoDevolucaoTotComPag() {
       
        if (locacaoModel.getRenovacao().equals("S")) {
            updateModelRenovacaoLocacaoFromDTCPV();
            updateModelItemLocacaoFromDTCPV();
        } else {
            updateModelLocacaoFromDTCPV();
            updateModelItemLocacaoFromDTCPV();
        }

    }

    @Override
    public void habilitarEdicao(boolean arg) {
        view.enableTxtValorTotalLocacao(arg);
        view.enableTxtValorDesconto(arg);
        view.enableTxtValorTotalPagar(arg);

        view.enableBtnCancelar(arg);
        view.enableBtnConfirmar(arg);
        view.enableBtnRecibo(arg);
    }

    @Override
    public void updateModelLocacaoFromDTCPV() {
        try {
            locacaoModel.setDataDevolucao((Date) formatter.parse(view.getDataDevolucao()));
            locacaoModel.setDataPagamento((Date) formatter.parse(view.getDataPagamento()));
            locacaoModel.setDiasLocacaoCalculado(view.getDiasLocacaoCalculado());
            locacaoModel.setDescontoValor(view.getValorDescontoValor());
            locacaoModel.setDescontoPorcento(view.getValorDescontoPorcentagem());
            locacaoModel.setValorTotalCalculado(view.getValorTotalPagar());
            locacaoModel.setValorPagar(view.getValorTotalPagar());           

            locacaoModel.setStatus("D");
            locacaoModel.setPagamento("S");

            locacaoDAO.update(locacaoModel);
        } catch (ParseException ex) {
            Logger.getLogger(DevolucaoTotComPagPresenter.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public void updateModelItemLocacaoFromDTCPV() {
        
        listaItemLocacaoModel = itemLocacaoDAO.findByIdLocacao(locacaoModel.getId());

        for (ItemLocacaoModel item : listaItemLocacaoModel) {
            item.setDataDevolucao(ManipuladorDatas.getDataAtual());
            item.setDataPagamento(ManipuladorDatas.getDataAtual());
            item.setPagamentoItem("S");
            item.setStatusItem("D");

            itemLocacaoDAO.update(item);
        }
    }

    @Override
    public void updateModelRenovacaoLocacaoFromDTCPV() {
        try {
            //*****************Atualizando os dados da renovação
            renovacaoLocacaoModel.setDataDevolucao((Date) formatter.parse(view.getDataDevolucao()));
            renovacaoLocacaoModel.setDataPagamento((Date) formatter.parse(view.getDataPagamento()));
            renovacaoLocacaoModel.setDiasLocacaoCalculado(view.getDiasLocacaoCalculado());
            renovacaoLocacaoModel.setDescontoValor(view.getValorDescontoValor());
            renovacaoLocacaoModel.setDescontoPorcento(view.getValorDescontoPorcentagem());
            renovacaoLocacaoModel.setValorTotalCalculado(view.getValorTotalPagar());
            renovacaoLocacaoModel.setValorPagar(view.getValorTotalPagar());           

            renovacaoLocacaoModel.setStatus("D");
            renovacaoLocacaoModel.setPagamento("S");

            renovacaoLocacaoDAO.update(renovacaoLocacaoModel);
            
            //*****************Atualizando os dados da locação
            updateModelLocacaoFromDTCPV();
            
        } catch (ParseException ex) {
            Logger.getLogger(DevolucaoTotComPagPresenter.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public IDevolucaoTotComPagView getView() {
        return view;
    }

    @Override
    public void setView(DevolucaoTotComPagView view) {
        this.view = view;
    }

    @Override
    public void createView() {
        //this.();            
        this.setUpViewListeners();
        this.habilitarEdicao(true);

        view.editableTxtValorTotal(false);
        view.editableTxtValorTotalPagar(false);
        
        updateViewFromAutomatismo();

        if (locacaoModel.getRenovacao().equals("S")) {
            updateViewFromRenovavaoLocacaoModel();
        } else {
            updateViewFromLocacaoModel();
        }

        if (mostraView) {
            view.packAndShow();
        }
    }

    public void setOperacao(Strategy operacao) {
        this.operacao = operacao;
    }

    public Strategy getOperacao() {
        return operacao;
    }

    private class ConfirmarStrategy implements Strategy {

        @Override
        public void execute() {
            System.out.println("ConfirmarStrategy");
            novoDevolucaoTotComPag();
        }
    }
}
